/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package constructiva;

import java.util.ArrayList;

/**
 *
 * @author Colino
 */
public class Constructiva 
{
        public int cantOperaciones;
        public int ContructivaAlgo(dgbi.BiGrafo Bigraf)
        {
            cantOperaciones = 0;
            Bigraf.cantidadCruces();
  
            cantOperaciones = Bigraf.cantOpertaciones;
            cantOperaciones++;
            int crucesASumar = 0;
            cantOperaciones++;
            int posFinal = 0;
            cantOperaciones++;
            dgbi.Node n;
            cantOperaciones++;
            for(int j = 0; j < Bigraf.iv1.size();)
            {
                
                posFinal = 0;
                
                n = Bigraf.iv1.get(j);
                
                Bigraf.insertarEnV1(n,0);
                Bigraf.iv1.remove(0);

                Bigraf.cantOpertaciones = 0;
                crucesASumar = Bigraf.CortesDeV1(0);
               int crucesASumar2 = 0;
               
               for(int i =1; i<Bigraf.v1.size();i++)
                {
                    Bigraf.moverEnV1(i-1, i);
                  /* 
                    Bigraf.v1.remove(i-1);
                    Bigraf.v1.add(i,n);
                    */
                    
                    Bigraf.cantOpertaciones= 0;
//                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    crucesASumar2 = Bigraf.CortesDeV1(i);
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones++;
                        posFinal = i;
                    }
                    cantOperaciones++;
                }

                Bigraf.moverEnV1(Bigraf.v1.size()-1, posFinal);
   //             Bigraf.v1.remove(Bigraf.v1.size()-1);
   //             Bigraf.v1.add(posFinal,n);
                cantOperaciones++;
                Bigraf.cantOpertaciones= 0;
  //              Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones++;
                Bigraf.cruces += crucesASumar;
                cantOperaciones++;
            }
            for(int j = 0; j < Bigraf.iv2.size();)
            {
                
                posFinal = 0;
                
                n = Bigraf.iv2.get(j);
                
                Bigraf.insertarEnV2(n,0);
                
                Bigraf.iv2.remove(0);
                
//                Bigraf.contruyeArreglosDePosiciones();

                crucesASumar = Bigraf.CortesDeV2(0);
                int crucesASumar2 = 0;
                
                for(int i =1; i<Bigraf.v2.size();i++)
                {
                
                    Bigraf.moverEnV2(i-1, i);
                    /*           
                    Bigraf.v2.remove(i-1);
                    Bigraf.v2.add(i,n);
                    */
                    
//                    Bigraf.contruyeArreglosDePosiciones();
                    cantOperaciones += Bigraf.cantOpertaciones;
                    crucesASumar2 = Bigraf.CortesDeV2(i);
                    cantOperaciones += Bigraf.cantOpertaciones;
                    cantOperaciones++;
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones++;
                        posFinal = i;
                    }
                    cantOperaciones++;
                }

                 Bigraf.moverEnV2(Bigraf.v2.size()-1, posFinal);
  //              Bigraf.v2.remove(Bigraf.v2.size()-1);
  //              Bigraf.v2.add(posFinal,n);

                Bigraf.cantOpertaciones= 0;
 //               Bigraf.contruyeArreglosDePosiciones();

                Bigraf.cruces += crucesASumar;

            }

            return Bigraf.cruces;
        }
        
        private ArrayList<Integer> ArregloPosiciones(int Longitud, int Porcent)
        {

            ArrayList<Integer> array = new ArrayList<Integer>();

            Integer temp;

            for(int i = 0; i < Longitud; i++ )
            {

                temp = (Integer)i;

                array.add(temp);

            }

            int cantPosiciones = (Longitud*(100-Porcent))/100;

            for(int i = 0;i < cantPosiciones ; i++)
            {
                cantOperaciones ++;
                int azar = (int)((Math.random()*100)%array.size());
                cantOperaciones ++;
                array.remove(azar);
                cantOperaciones ++;
            }
            cantOperaciones ++;
            return array;
        }
        
        public int ContructivaAlgoGrasp(dgbi.BiGrafo Bigraf, int Porcent)
        {
            
            ArrayList<Integer> array = ArregloPosiciones(Bigraf.v1.size(), Porcent);
            
            Bigraf.cantidadCruces();
            
         
            boolean b = true;

            int crucesASumar = 0;
            
            int posFinal = 0;
   
            dgbi.Node n;
   
            for(int j = 0; j < Bigraf.iv1.size();)
            {
   
                posFinal = 0;
   
                n = Bigraf.iv1.get(j);
   
                Bigraf.insertarEnV1(n,array.get(0).intValue());
                Bigraf.iv1.remove(0);
   
 //               Bigraf.contruyeArreglosDePosiciones();
                crucesASumar = Bigraf.CortesDeV1(array.get(0).intValue());
                int crucesASumar2 = 0;
   
                for(int i = 1 ; i < array.size();i++)
                {

                  Bigraf.moverEnV1(array.get(i-1).intValue(), array.get(i).intValue());
                    
                    /*
                    Bigraf.v1.remove(array.get(i-1).intValue());
                    Bigraf.v1.add(array.get(i).intValue(),n);
                */
 //                   Bigraf.contruyeArreglosDePosiciones();
                    crucesASumar2 = Bigraf.CortesDeV1(array.get(i).intValue());
                    if(crucesASumar2 < crucesASumar)
                    {
          
                        crucesASumar =crucesASumar2;
          
                        posFinal = array.get(i).intValue();
                    }
          
                }
          
                Bigraf.moverEnV1(array.get(array.size()-1).intValue(), posFinal);
                
 //                 Bigraf.removerEnV1(array.get(array.size()-1).intValue());
 //                 Bigraf.insertarEnV1(n,posFinal);
                  
//                Bigraf.v1.remove(array.get(array.size()-1).intValue());
//                Bigraf.v1.add(posFinal,n);
                array = ArregloPosiciones(Bigraf.v1.size(), Porcent);
//                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                Bigraf.cruces += crucesASumar;
                cantOperaciones ++;
            }
            cantOperaciones ++;
            array = ArregloPosiciones(Bigraf.v2.size(), Porcent);
            cantOperaciones ++;
            for(int j = 0; j < Bigraf.iv2.size();)
            {
                
                posFinal = 0;
                
                n = Bigraf.iv2.get(j);
                
                Bigraf.insertarEnV2(n,array.get(0).intValue());
                Bigraf.iv2.remove(0);

                
  //              Bigraf.contruyeArreglosDePosiciones();
                
                crucesASumar = Bigraf.CortesDeV2(array.get(0).intValue());
                
                
                int crucesASumar2 = 0;
                
                array = ArregloPosiciones(Bigraf.v2.size(), Porcent);
                
                for(int i = 1 ; i < array.size();i++)
                {
                
                  Bigraf.moverEnV2(array.get(i-1).intValue(), array.get(i).intValue());
                    /*
                    Bigraf.v2.remove(array.get(i-1).intValue());
                    Bigraf.v2.add(array.get(i).intValue(),n);
                */
//                    Bigraf.contruyeArreglosDePosiciones();
                
                    crucesASumar2 = Bigraf.CortesDeV2(array.get(i).intValue());
                    if(crucesASumar2 < crucesASumar)
                    {
                        cantOperaciones ++;
                        crucesASumar =crucesASumar2;
                        cantOperaciones ++;
                        posFinal = array.get(i).intValue();
                    }
                    cantOperaciones ++;
                }
                
                Bigraf.moverEnV2(array.get(array.size()-1).intValue(), posFinal);
                 
/*      
                Bigraf.v2.remove(array.get(array.size()-1).intValue());
                Bigraf.v2.add(posFinal,n);
  */
                cantOperaciones ++;
//                Bigraf.contruyeArreglosDePosiciones();
                cantOperaciones += Bigraf.cantOpertaciones;
                cantOperaciones ++;
                Bigraf.cruces += crucesASumar;
            }
            cantOperaciones ++;
            int res = Bigraf.cantidadCruces();
//            System.out.println("crucesGolos: "+Bigraf.cruces);
            return res;
        }
}
